package io.modifier.basic.compose.paging

import androidx.paging.PagingData
import androidx.paging.map
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.flow.update

class PagingDataModifier<T : Any>(
    /** 原始数据 */
    sourceFlow: Flow<PagingData<T>>,
    /** 获取项的ID */
    private val getID: (T) -> Any,
) {
    private val _modifyFlow = MutableStateFlow<Map<Any, T>>(emptyMap())

    /** 数据流 */
    val flow = sourceFlow
        .onEach {
            // 有新数据时清空 _modifyFlow 的数据
            _modifyFlow.update { emptyMap() }
        }
        .combine(_modifyFlow) { data, modify ->
            if (modify.isEmpty()) {
                // modify为空，返回原始数据
                data
            } else {
                // 如果 modify 中存在则优先使用 modify 中的数据
                data.map { modify[getID(it)] ?: it }
            }
        }

    /** 更新项 */
    fun update(item: T) {
        _modifyFlow.update { modifyMap ->
            val id = getID(item)
            if (modifyMap[id] == item) {
                // 数据未变化，不更新Flow
                modifyMap
            } else {
                modifyMap + (id to item)
            }
        }
    }
}
